﻿#ifndef CDATABASEOPERMGR_H
#define CDATABASEOPERMGR_H

#include "QThreadBase.h"
#include "dbstruct.h"
#include "cdatabasexml.h"
#include "cdbtabledatainfo.h"
#include "cdatabasemgrbase.h"

class CDatabaseOperMgrPrivate;
class CLogBase;

/***********************************************
* [className]   CDatabaseOperMgr
* [func]        数据库管理类
* [author]      jhb
* [date]        2023-12-06 09:13
* [Modification Log]
* Version               By              Notes
* v0.0.1                jhb             初次建立
************************************************/
class CDatabaseOperMgr : public QThreadBaseEX, public CDatabaseMgrBase
{
    Q_OBJECT
public:
    CDatabaseOperMgr();
    virtual ~CDatabaseOperMgr();

public:

    /***************************************************************
    * @datatime 2023-12-06 09:20:00
    * @author   jhb
    * @brief    设置数据库读写连接数量
    * @input    const quint8 &nReadNum  读连接数量
    *           const quint8 &nWriteNum 写连接数量
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool setConnectNumber(const quint8 &nReadNum, const quint8 &nWriteNum);

    /***************************************************************
    * @datatime 2023-12-06 11:20:16
    * @author   jhb
    * @brief    设置数据库连接信息
    * @input    const SDataBaseConfig &stDbCfg 数据库连接信息
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg);

    /***************************************************************
    * @datatime 2023-12-07 08:59:12
    * @author   jhb
    * @brief    设置数据库连接信息
    * @input    const CDataBaseConfig &stDbCfg  数据库连接信息
    *           QVector<QString> vecTableName   表名集合
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, QVector<QString> vecTableName);

    /***************************************************************
    * @datatime 2023-12-07 16:16:07
    * @author   jhb
    * @brief    设置数据库连接信息
    * @input    const CDataBaseConfig &stDbCfg  数据库连接信息
    *           const QString &strTables        表名集合，表名以逗号分隔(例"action_record,bar_cfg")
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, const QString &strTables);

    /***************************************************************
    * @datatime 2023-12-08 10:12:18
    * @author   jhb
    * @brief    设置数据库连接信息
    * @input    const CDataBaseConfig &stDbCfg      数据库连接信息
    *           QVector<CDbTableInfo> vecTableInfo  数据库表信息集合
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, QVector<CDbTableInfo> vecTableInfo);

    /***************************************************************
    * @datatime 2023-12-07 09:32:48
    * @author   jhb
    * @brief    开启事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool transaction(const QString &strId, int nType = enDBWrite);

    /***************************************************************
    * @datatime 2023-12-07 09:35:32
    * @author   jhb
    * @brief    提交事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool commit(const QString &strId);

    /***************************************************************
    * @datatime 2023-12-07 09:35:37
    * @author   jhb
    * @brief    回滚事务
    * @input    const QString &strId 事务唯一ID
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool rollback(const QString &strId);

    /***************************************************************
    * @datatime 2023-12-07 13:16:38
    * @author   jhb
    * @brief    获取数据库操作信息
    * @input    const int &nTable   库表索引
    *           const int &nLock    锁模式
    * @output   无
    * @return   DbDataInfo* 数据库操作信息指针
    * @note
    ****************************************************************/
    CDbTableDataInfo *getDbDataInfo(const int &nTable, const int &nLock = enBLOCK);

    /***************************************************************
    * @datatime 2023-12-07 13:16:38
    * @author   jhb
    * @brief    获取数据库操作信息
    * @input    const QString &strTable 库表名
    *           const int &nLock    锁模式
    * @output   无
    * @return   DbDataInfo* 数据库操作信息指针
    * @note
    ****************************************************************/
    CDbTableDataInfo *getDbDataInfo(const QString &strTable, const int &nLock = enBLOCK);

    /***************************************************************
    * @datatime 2023-12-07 10:19:40
    * @author   jhb
    * @brief    获取执行结果
    * @input    const int &nTable   库表索引
    *           const int &nLock    资源锁解锁方式，默认非SELECT执行成功或SELECT执行失败，则自动解锁
    * @output   无
    * @return   false|失败 true|成功
    * @note
    ****************************************************************/
    bool getResult(const int &nTable, const int &nLock = enLockSELECT);

    /***************************************************************
    * @datatime 2023-12-07 10:34:03
    * @author   jhb
    * @brief    获取执行结果
    * @input    const QString &strTable 数据库表名
    *           const int &nLock    资源锁解锁方式，默认非SELECT执行成功或SELECT执行失败，则自动解锁
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    bool getResult(const QString &strTable, const int &nLock = enLockSELECT);

    /***************************************************************
    * @datatime 2023-12-06 13:25:16
    * @author   jhb
    * @brief    设置日志组件指针
    * @input    CLogBase *pLog 日志组件指针
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    void setLogPtr(CLogBase *pLog);

    /***************************************************************
    * @datatime 2024-01-05 08:53
    * @author   jhb
    * @brief    设置数据库打开成功回调函数
    * @input    DbOpenDoneCallback *func    回调函数
    * @output   无
    * @return   true:成功
    *           false:失败
    * @note
    ****************************************************************/
    bool setDbOpenDoneCb(DbOpenDoneCallback func);

    /***************************************************************
    * @datatime 2024-03-07 15:20
    * @author   jhb
    * @brief    使用结构体数据直接执行SQL,返回结果
    * @input    const int &nLock            资源锁解锁方式，默认自动解锁,非阻塞形式
    * @output   CDatabaseExecData &data     数据库执行数据
    * @return   无
    * @note
    ****************************************************************/
    bool exec(CDatabaseExecData &data, const int &nLock = enNONBLOCK);

signals:
    //数据库打开完成信号
     void sigDbOpenDone();

private slots:
    //工作线程
    virtual void slotWorkProc();

private:
    CDatabaseOperMgrPrivate *d_ptr;
    Q_DECLARE_PRIVATE(CDatabaseOperMgr)
};

#endif // CDATABASEOPERMGR_H
